/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Example_01_String.java]
 * Creation Date        [05-Jul-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_api;

/**
 * 字符串相关
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Example_01_String {

	/**
	 * 测试方法
	 * 
	 * @param args
	 *            命令行参数
	 */
	public static void main(String[] args) {

		/**
		 * String pool方式创建对象<br>
		 * 
		 * 1. 查找String pool中是否存在"abc"这个对象<br>
		 * 2. 如果不存在, 则在String pool中创建, 然后将String pool中的这个"abc"对象的地址返回赋值给str1<br>
		 * 3. 如果存在, 则不创建任何对象, 直接将String pool中的对象地址返回赋值给str2<br>
		 * 
		 */
		String str1 = "abc";// Sting pool中创建一个对象
		String str2 = "abc";// 不创建新对象
		System.out.println("str1 == str2 " + (str1 == str2));// true

		/**
		 * new方式创建对象<br>
		 * 
		 * 1. 在String pool中查找有没有"abc"这个字符串对象<br>
		 * 2. 如果有, 则不在String pool中创建, 直接在Heap中创建一个"abc"对象并将Heap中的地址返回赋值给str3<br>
		 * 3. 如果没有, 则先在String pool中创建一个"abc"对象,
		 * 然后在Heap中创建一个"abc"对象并将Heap中的地址返回赋值给str4<br>
		 */
		String str3 = new String("abc");// Heap中创建一个对象
		String str4 = new String("abc");// Heap中创再建一个对象
		System.out.println("str1 == str3 " + (str1 == str3));
		System.out.println("str3 == str4 " + (str3 == str4)); // false

		String str5 = "hello";
		String str6 = " world";
		String str7 = str5 + str6;
		/**
		 * String是常量, 其对象一旦创建就无法改变, 当使用 + 拼接字符串时, 会生成新的String对象
		 */
		String str8 = "hello" + " world";
		System.out.println("str7 == str8 " + (str7 == str8)); // false

		String str9 = new String("hello");
		/**
		 * intern方法<br>
		 * 
		 * 1. 如果String pool中有这个字符串对象, 则直接返回String pool中的对象地址<br>
		 * 2. 如果String pool中没有这个字符串对象, 则在String pool中创建一个新的对象并将地址返回<br>
		 */
		System.out.println("str5 == str9 " + (str5 == str9.intern()));

	}
}
